/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MiddleLayer;

import GUI.Hearts;
import MiddleLayer.OtherClass.CommandStruct;
import MiddleLayer.OtherClass.CommandStruct.MessageType;
import NetworkManager.MultiThreadChatClient;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JPanel;

/**
 *
 * @author ThanhTri
 * Lớp xử lý các sự kiện ở Client. Bao gồm:
 * - GUI
 * - Gửi và nhận dữ liệu với client.
 * - Kiểm tra nước đi có hợp lệ hay không
 */
public class ClientProcessing implements Observer{

    
    Hearts heartGame = null;

    public GameRules gameRules = new GameRules();
    protected Cards lstCard = new Cards();

    MultiThreadChatClient client = new MultiThreadChatClient();;
    int port_number = 2223;

    int iFirstPlayerInThisRound = -1;
    private Hearts game;// game của mình
    private JPanel pnlInfo;//panel chứa control chat và hiển thị thông tin

    /*
     * Tìm kiếm client kết nối trong mạng LAN
     */
    public void findServer()
    {
    }


    /**
     * @param info là panel chứa thông tin, chat
     * @param game game mình đang chạy
     */
    public void setup(JPanel info, Hearts game) {
        this.game = game;
        this.pnlInfo = info;

        this.gameRules = new GameRules();
    }

    /*
     * Kết nối vào client
     */
    public void connectToServer(String clientName)
    {
        client.connectToServer("localHost", port_number);

        //Sau khi kết nối lập tức gửi ngay tên lên
        client.sendMessage(CommandStruct.createNewPlayerCMDStruct(clientName));
    }

    /*
     * Kiểm tra nước đi xem có thỏa luật chơi không
     * Truyền vào tham số của lá bài định đi
     * Và cho biết là sẽ đi lượt đầu tiên hay ra bài chờ người khác
     */
    private boolean isTheMoveValid(int iCardIDWillPlay, int iCardIDWasPlayByOtherPlayer, boolean bIsLeadMove)
    {
        boolean result = false;

        if(bIsLeadMove)
            result = gameRules.isLeadMovingValid(iCardIDWillPlay);
        else
            result = gameRules.isMovingValid(iCardIDWillPlay, iCardIDWasPlayByOtherPlayer, this.lstCard);

        return result;
    }


    /*
     * Khởi tạo GUI
     */
    public void initGUI()
    {
    }

    /*
     * Khởi tạo game
     */
    public void initGame()
    {
        this.client.addObserver(this);

        //Truyền con trỏ this vào Hearts
        //heartGame = new Hearts();

        //Sau đó có thể dùng GUI để gọi đến hàm connectToServer
        //v`i cái game gắn với cái form? l`am sao đ^ay
        this.connectToServer("client1");

    }

    public void startGame()
    {
        //Vòng lặp game
//        while(!client.closed){
//        }
    }

    //Có dữ liệu đến, lấy dữ liệu (CommandStruct) ra xử lý cho game
    public void update(Observable o, Object arg) {
        CommandStruct cmdStruct = (CommandStruct)arg;
        processMessageFromServer(cmdStruct);
    }

    /**
     * Tập trung các thông điệp về để xử lý
     */
    private void processMessageFromServer(CommandStruct cmdStruct)
    {
        switch(cmdStruct.getMessageType())
        {
            case NewPlayer:
                //Hiện khung chat
                System.out.println(cmdStruct.getContentOfMessage());
                break;

            case Chat:
                //Hiện khung chat
                System.out.println(cmdStruct.getContentOfMessage());
                break;

            case Pass://Client sẽ nhận được từ server danh sách bài mới
                List<Integer> lstNewIDs = cmdStruct.getUpdateIDCards();
                this.lstCard.clearCards();
                for(int i = 0; i < lstNewIDs.size(); ++i)
                {
                    this.lstCard.addCard(lstNewIDs.get(i));
                }
                break;

            case StartPlaying://Được nhận từ client nào đó không cần biết. Mặc định là chỉ client tạo server mới được thực hiện chức năng này
                this.startGame();
                break;

            case PlayCard://Cho biết người chơi khác đã đi nước này

                //Hiển thị lên màn hình rồi ngồi chò
                Card cardPlayed = new Card(Integer.parseInt(cmdStruct.getContentOfMessage()));

                //Client sau khi chọn xong sẽ dùng hàm khác gửi nội dung lên server
                break;

            case NewRound://Cho biết ai sẽ là người đi trước
                iFirstPlayerInThisRound = Integer.parseInt(cmdStruct.getContentOfMessage());
                break;

            case NewDeal://Lượt thi đấu mới
                System.out.println("Vòng đấu mới sắp bắt đầu");
                //Gọi hàm để hiển thị cho người chơi biết
                break;

            case Quit:
                break;
        }
    }

    public void sendMessageToServer(MessageType messageType, String content)
    {
        switch(messageType)
        {
            case Chat:
                this.client.sendMessage(new CommandStruct(messageType, content));
                break;
            case PlayCard:
                this.client.sendMessage(new CommandStruct(messageType, content));
                break;
            case StartPlaying://bắt đầu kết nối tới server để chơi
                this.client.sendMessage(new CommandStruct(messageType, ""));
                break;
        }
    }

}
